package com.xl.web.service.sys;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.xl.base.annotation.DataSource;
import com.xl.base.service.BaseService;
import com.xl.core.constant.Globals;
import com.xl.core.enums.SourceEnum;
import com.xl.core.util.StringUtil;
import com.xl.web.dao.sys.SysRoleDao;
import com.xl.web.entity.sys.SysRole;
import com.xl.web.entity.sys.SysRoleMember;
import com.xl.web.entity.sys.SysRoleMenu;

/**
 * 角色操作Service
 * 
 * @author 梁华
 * 
 * @param <T>
 */
@Service("sysRoleService")
public class SysRoleService<T extends SysRole> extends BaseService<SysRole> {

	// 角色操作Dao
	@Autowired(required = false)
	private SysRoleDao<SysRole> sysRoleDao;

	public SysRoleDao<SysRole> getDao() {
		return sysRoleDao;
	}

	/**
	 * 根据code查询角色
	 * 
	 * @param code
	 * @return
	 */
	@DataSource(source = SourceEnum.TYPE_SLAVE)
	public SysRole queryByCode(Object code) {
		return getDao().queryByCode(code);
	}

	/**
	 * 检测角色是否存在
	 */
	@DataSource(source = SourceEnum.TYPE_SLAVE)
	public int checkRoleExist(SysRole role) throws Exception {
		return getDao().checkRoleExist(role);
	}

	/**
	 * 角色菜单分配保存
	 * 
	 * @param role
	 * @throws Exception
	 */
	public void allotSave(SysRole role, String checkedMenu) throws Exception {

		// 将原有的分配记录删除
		getDao().deleteRoleMenuByRoleId(role.getId());

		if (!StringUtil.isEmpty(checkedMenu)) {

			// 将菜单分解
			String[] menuList = checkedMenu.split(Globals.COMMA);

			// 循环插入新的记录
			SysRoleMenu item = null;
			for (String menuId : menuList) {
				item = new SysRoleMenu();
				item.setMenuId(menuId);
				item.setRoleId(role.getId());
				item.preInsert();
				getDao().addRoleMenu(item);
			}
		}
	}

	/**
	 * 角色人员分配保存
	 * 
	 * @param role
	 * @throws Exception
	 */
	public void allotMemberSave(SysRole role, String checkedMember)
			throws Exception {

		// 将原有的分配记录删除
		getDao().deleteRoleMemberByRoleId(role.getId());

		if (!StringUtil.isEmpty(checkedMember)) {

			// 将菜单分解
			String[] memberList = checkedMember.split(Globals.COMMA);

			// 循环插入新的记录
			SysRoleMember item = null;
			for (String memberId : memberList) {
				item = new SysRoleMember();
				item.setMemberId(memberId);
				item.setRoleId(role.getId());
				item.preInsert();
				getDao().addRoleMember(item);
			}
		}
	}

	/**
	 * 删除角色
	 */
	@Override
	public void delete(Object... ids) throws Exception {
		if (ids == null || ids.length < 1) {
			return;
		}
		for (Object id : ids) {
			// 删除角色人员分配记录
			getDao().deleteRoleMemberByRoleId(id);

			// 删除角色菜单分配记录
			getDao().deleteRoleMenuByRoleId(id);

			// 删除角色
			getDao().delete(id);
		}
	}

	/**
	 * 查询用户所拥有的权限
	 * 
	 * @param sysRoleMember
	 * @return
	 */
	@DataSource(source = SourceEnum.TYPE_SLAVE)
	public List<SysRoleMember> memberRoleList(SysRoleMember sysRoleMember) {
		return sysRoleDao.memberRoleList(sysRoleMember);
	}
}
